Wrox Home  
Search

Topic: ASP.NET

Professional DNN7: Open Source .NET CMS Platform (111885084X) cover image

Professional DNN7: Open Source .NET CMS Platform

Shaun Walker, Bruce Chapman, Cathal Connolly, Peter Donker, Israel Martinez, Charles Nurse, Chris Paterra, Clinton Bland, Ashish Prasad, Nathan Rover, Mitchel Sellers, Dennis Shiao, Will Strohl, Erik van Ballegoij, Scott Willhite, Ralph Williams, Jr.
ISBN: 978-1-118-85084-8
Paperback
768 pages
May 2015
This title is out-of-print and not currently available for purchase from this site.


About This Title  |  Download Code  |  Errata  |  P2P Forum for This Title
INTRODUCTION xli

CHAPTER 1: AN INSIDE LOOK AT THE EVOLUTION OF DNN 1

From Humble Beginnings… 2

The Dot-Com Era 4

IBuySpy Portal 5

ASP.NET 6

IBuySpy Portal Forum 8

IBuySpy Workshop 9

Subscription Fiasco 11

Microsoft 13

DotNetNuke 14

Licensing 15

Core Team 17

XXL Fork 19

Trademarks 20

Sponsorship 21

Enhancements 22

Security Flaw 24

DotNetNuke 2.0 25

DotNetNuke.com Website 26

Provider Model 27

Open Source Philosophy 27

Stabilization 28

Third-Party Components 28

Core Team Reorganization 29

Microsoft Membership API 30

“Breaking” Changes 30

Web Hosters 31

DotNetNuke 3.0 32

Release Schedule 33

DotNetNuke Projects 34

Intellectual Property 35

Marketing 36

Microsoft Hosting Program 38

Infrastructure 39

Branding 40

Tech Ed 43

Credibility 44

Trademark Policy 45

ASP.NET 2.0 46

Reorganization 47

Microsoft Conferences 48

DotNetNuke 4.0 49

Slashdotted 52

Benefactor Program 52

Opportunists 56

Yin and Yang 57

A New Company 58

Larry Augustin 59

Performance 60

DotNetNuke Marketplace 61

Free Module Promotion 63

Conferences 64

Microsoft Valuable Professionals 65

Fundraising 65

Awards and Accolades 66

DotNetNuke OpenForce 07 66

SLA Program 67

More Fundraising 68

CodePlex 69

Security Issues 70

IP Disputes 71

Term Sheets 73

DotNetNuke OpenForce 08 75

DotNetNuke Professional 76

Series A Announcement 78

Physical Offices 79

DotNetNuke 5.0 80

Day of DotNetNuke 80

DNN-Europe 81

Snowcovered Acquisition 81

Telerik Partnership 82

Series B 83

Open-DocumentLibrary Acquisition 84

DotNetNuke Enterprise Edition 84

POET Vulnerability 85

DotNetNuke.com Overhaul 85

Active Modules Acquisition 87

Nik Kalyani Leaves DNN Corp 87

Cloud. Mobile. Social. 88

DotNetNuke 6.0 88

DotNetNuke World 2011 89

DotNetNuke Gets Social 90

Microsoft Azure Partnership 91

DNN World 2012 92

DotNetNuke 7.0 92

iFinity Acquisition 93

10-Year Anniversary 93

DNN Social 94

DotNetNuke.com Hacked 95

Rebranding 95

DNNCon 98

Scott Willhite Moves On 98

DNN 7.x Releases 99

My Departure from DNN Corp 99

Summary 102

CHAPTER 2: INSTALLING DNN VERSION 7 103

What You Need to Install DNN Platform Version 7 104

Installing the DNN Platform Using the Installation Package 104

Step 1: Download the Software 104

Step 2: Unzip the Package 105

Step 3: Create a Database in SQL Server 106

Step 4: Create a Database Account 106

Step 5: Configure IIS 107

Step 6: Set File and Folder Permissions 107

Step 7: Perform the Installation 107

Installing the DNN Platform Using the Web Platform Installer 110

Downloading the Software 111

Installing the DNN Platform 111

Upgrading the DNN Platform to Version 7 114

Getting a Trial Version of Evoq Content 115

Common Installation Issues 116

Summary 117

CHAPTER 3: DNN PLATFORM OVERVIEW 119

Core Platform Objects 119

Sites (Portals) 119

Pages (Tabs) 122

Theme (Skin) 124

Modules 125

Security 127

Users 128

Roles 128

Host 130

Admin 130

Summary 130

CHAPTER 4: SITE ADMINISTRATION 131

What Is Site Administration? 131

Common Administrative Tasks 132

Control Panel Sections 132

Admin 133

Tools 134

Help 134

Modules and Pages 134

Users 134

Edit Page 135

Admin Menu Features 135

Common Settings 135

Event Viewer 136

File Management 139

Page Management 148

Recycle Bin 151

Security Roles 155

Site Settings 162

User Accounts 181

Advanced Settings 185

Advanced Configuration Settings 185

Device Preview Management 186

Extensions 187

Google Analytics 187

Languages 188

Lists 189

Newsletters 189

Search Admin 190

Search Engine Site Map 191

Site Log 191

Site Redirection Management 191

Site Wizard 192

Skins 193

Taxonomy 194

Vendors 194

Best Practices for Site Administrators 195

Getting User Registration Right 195

Having a Naming Convention 195

Never Sharing User Accounts 196

Editing as a Content Editor 196

Fewer Administrators, Not More 197

Fewer Permissions, Not More 197

Never Using “User” Permissions 198

Having a Process and Standards 199

Getting to Know Your Features 199

Summary 199

CHAPTER 5: HOST ADMINISTRATION 201

Why Do You Need the Host? 202

What Is Host Administration? 202

Host Attributes 203

Host Menu Pages 203

Dashboard 204

Extensions 205

Tab: Installed Extensions 205

Tab: Available Extensions 208

Tab: Purchased Extensions 208

Tab: More Extensions 209

Buttons: Install Extension Wizard 209

Buttons: Create New Extension and Create New Module 210

File Management 210

Host Settings 210

The Buttons 210

Basic: Configuration 212

Basic: Host Details 213

Basic: Appearance 213

Basic: Payment Settings 213

Advanced: Friendly URL Settings 214

Advanced: Proxy Settings 214

Advanced: SMTP Server Settings 214

Advanced: Performance Settings 215

Advanced: jQuery Settings 216

Advanced: CDN Settings 216

Advanced: Client Resource Management 217

Advanced: Membership Management 218

Advanced: Login IP Filters 218

Advanced: Search Settings 218

Other: Request Filters 219

Other: Site Log 219

Other: Auto-Unlock Accounts After 219

Other: Allowable File Extensions 220

Other: Auto-Sync File System 220

Other: Allow Content Localization 220

Site Management 221

Configuration Manger 222

Device Detection Management 222

HTML Editor Manager 222

Lists 224

Schedule 224

Schedule Item Details 225

Configuration 227

SQL 227

Vendors 228

Additional Host Features on Admin Site Settings 228

Event Viewer 228

Site Settings 229

Advanced: Site Aliases 229

Advanced: SMTP Server Settings 230

Advanced: SSL Settings 231

Advanced: Messaging Settings 232

Advanced: Host Settings 232

Page Management 233

Advanced Configuration Settings 233

Languages 234

Additional Host Features on the Control Panel 235

Tools Menu 236

Modules Menu 236

Host Options on the Module Actions Menu 236

Integrating with a Third-Party Provider 238

Installing the Facebook Provider 238

Setting Up the Facebook Application 240

Activating the Facebook Provider 241

Summary 242

CHAPTER 6: MODULES 243

What Is a Module? 243

Where Do Modules Live on a Page? 244

Adding a Module to a Page 245

One Module Across Multiple Pages 246

One Module Across Multiple Sites 246

Working with Modules 247

Moving Modules 247

Module Settings and Action Menus 248

The Module Settings Tab 249

The Permissions Tab 249

The Page Settings Tab 251

Where to Get Modules 252

The DNN Store 252

Forge 252

Developing Your Own Modules 253

Viewing Modules and Extensions 253

Installing Modules into DNN 253

The Extension Verifi cation System 254

In Depth with the HTML Module 254

Administrating the HTML Module 256

HTML Pro Module Features in Evoq Content 256

Summary 256

CHAPTER 7: SYSTEM ARCHITECTURE 257

Patterns and Concepts 258

Provider Pattern 258

Service Locator Pattern 260

Inversion of Control (IoC) Container 261

Repository Pattern 262

Architectural Overview 264

Data Layer 264

Install Scripts 264

Upgrade Scripts 265

Script Syntax 265

Data Access Layer 267

Data Access Layer (DAL) 2 268

Business Layer 269

Presentation Layer 271

Namespace Overview 273

DotNetNuke.dll 273

DotNetNuke.Web.dll 274

Summary 274

CHAPTER 8: CORE DNN APIS 275

The CBO Class 275

Hydration Methods 276

The IHydratable Interface 277

Caching 278

The DataCache Class 278

GetCachedData 278

Event Logging 280

Creating New Logging Types 280

Logging an Event Using the Logging API 282

The EventLogController Class 282

Exception Management 283

The Exceptions Class 283

Scheduler 284

Module Interfaces 285

IModuleControl 286

IActionable 287

IPortable 289

Summary 290

CHAPTER 9: MEMBERSHIP SECURITY 291

DNN Membership Overview 291

Membership Provider 292

Authentication Providers 295

Membership Management Enhancements 301

Summary 306

CHAPTER 10: LOCALIZATION 307

Locales in DNN 308

Locale Detection 308

Content Localization 309

Resource Files 310

Application Resources 311

Global Resources 311

Local Resources 312

Resource File Handling 312

The Resource File Editor 315

Missing Resource Keys 317

The API 317

The GetString Method 318

The GetSystemMessage Method 319

Token Replacement Engine 322

Localizing Modules 324

Case 1: Handling Static Strings in the ASCX File 325

Case 2: Handling Static Text in Server Controls 325

Case 3: Handling Static Text Programmatically 327

Summary 328

CHAPTER 11: SEARCH 329

History 329

Objectives of the New Search Functionality 330

Apache Lucene 330

Lucene.Net 330

Lucene: A Document Store 330

Lucene versus Lucene.Net 331

Lucene.Net Contrib 331

Search Architecture 332

Platform Features 332

Site Crawler 333

Near Real-Time Searching 334

Speed 334

Auto-Preview 334

Site-Scoped Search 335

Module-Scoped Search 336

Advanced Search 336

Filtering by Tags 336

Filtering by Content’s Modifi cation Time 337

Filtering by Search Types 337

Locale-Aware Search 337

Delta Indexing 338

Ranking 338

Lucene’s Native Syntax 338

Ignore Words 339

Synonyms 339

Evoq Features 340

URL Crawler 341

Scoping Below a URL 341

DNN Role Impersonation 342

Windows Authentication 342

No Duplication with Site Crawler 342

File Crawler 343

Scoping by Folders 343

Scoping by File Extension 344

Crawling a File’s Content 344

Excluding by Extension 345

Administration 345

Default Index File Location 345

Web-Farm Configuration 346

Re-Indexing 346

Getting Lucene Stats 347

Compacting 348

Custom Analyzer 348

Search Phases 348

Content Acquisition 348

Content Indexing 349

Content Searching 350

Module Integration 351

ModuleSearchBase 351

GetModifiedSearchDocuments 352

Entities 352

SearchType 353

SearchDocument 354

SearchQuery 356

SearchResult 357

APIs 358

Public APIs 358

Unsupported (yet Useful) APIs 358

Writing a New Crawler 360

Troubleshooting 361

Indexing 362

Querying 364

Luke 364

Summary 366

CHAPTER 12: URL MANAGEMENT 367

The History of DNN URL Schemes 367

TabId-Based URLs 367

Friendly URLs Version 1 368

Friendly URLs Version 2 368

Advanced URLs in DNN 7 369

Switching an Upgraded Site to Advanced Mode 370

SEO Focus on URLs 371

Understanding URL Structure in DNN 371

URL Configuration and Customization 372

Creating Custom URLs for DNN Pages 373

Advanced URL Creation for Evoq 374

Creating a Custom URL in Evoq 374

Creating a Custom URL Redirect in Evoq 375

Testing Custom URLs and Redirects in Evoq 377

Site- and Installation-Level URL Confi guration 381

Installation-Level Confi guration Options 381

Site Alias Confi guration 382

SSL URL Confi guration 384

Evoq Advanced URL Settings 384

Evoq Advanced URL Management Options 385

URL Creation for Developers 390

Custom Extension URL Providers 391

Installation and Configuration of Extension URL Providers 392

Testing of Extension URL Provider Functionality 392

Testing Extension URL Providers in Evoq 392

DNN URL Best Practices 394

Configuring URL Options for DNN Sites 394

Troubleshooting and Debugging DNN URLs 395

Using the Debug Mode for Advanced URLs 398

Summary 399

CHAPTER 13: BEGINNING MODULE DEVELOPMENT 401

A Guided Tour of Your Work Environment 403

ASP.NET Web Forms 403

The DNN Platform 404

Anatomy of a DNN Module 406

Your Toolbox 407

The Environment 408

DNN 408

SQL Server 410

IIS 410

To VM or Not to VM 411

Organizing Your Project 412

Inline versus External Module Creation 412

Hello World 412

The Razor Host Module 414

Hello World in Razor 415

Final Remarks 417

WAP versus WSP 417

Inside versus Outside the Root 417

Module Design Considerations 418

Three-Tiered Design and MVC 418

DAL 418

Client-Side versus Server-Side 419

Localization 420

About Modules, TabModules, Module Defi nitions 421

Packages 421

DesktopModules 422

ModuleDefinitions 422

ModuleControls 424

Modules 424

TabModules 424

A Guestbook Module 426

Module Templates and Build Tasks 426

Creating the Project 427

The Data Layer—SQL 429

The Data Layer—DAL 2 431

Settings 434

The UI 438

Results 446

Wrapping It Up 446

The Manifest 448

The Preamble 450

SQL Scripts 450

The Resource File 451

The Module Definition 451

Assemblies 451

Packing Up the Guestbook Module 451

Creating a Source Version 452

Build Automation 452

Summary 453

CHAPTER 14: DEVELOPING MODULES: USER INTERFACES 455

Understanding DNN and Module Interactions 455

Dialogs and AJAX Support 456

DNN AJAX Support 456

DNN Modal Dialogs 457

JavaScript, jQuery, and Custom Scripts 459

Using jQuery and jQuery UI 459

Including Knockout 460

Registering Custom Scripts and CSS 460

DNN jQuery Plugins 462

dnnAlert 462

dnnConfirm 463

dnnPanels 463

dnnTabs 466

Handling Postbacks 467

Implementing Consistent Design 468

Messages and Alerts 468

Forms and Buttons 469

Using Module CSS 470

Summary 471

CHAPTER 15: DEVELOPING MODULES: BUSINESS LOGIC 473

Navigating with the DNN API 474

DotNetNuke.Common Namespace 474

DotNetNuke.Common.Globals Class 474

DotNetNuke.Common.Lists.ListController 475

DotNetNuke.Common.Utilities.CBO Object 476

DotNetNuke.Common.Utilities.DataCache Object 476

DotNetNuke.Entities Namespace 477

_Info Objects 477

_Controller Objects 477

Host and PortalSettings Objects 478

DotNetNuke.Framework Namespace 480

AJAX Class 480

CDefault Class 480

PageBase Class 481

DotNetNuke.Security Namespace 481

Membership Namespace 481

Permissions Namespace 481

Roles Namespace 482

DotNetNuke.Services Namespace 482

Exceptions Class 482

Mail 483

Using Common DotNetNuke Controls 484

LabelControl—Field Inputs 484

TextEditor—Rich Text Editing 485

Leveraging Web API 486

Adding the Proper References 486

Defining the Web API RouteMapper 486

Creating the Controllers 488

Creating DNN Scheduled Jobs 490

Controlling Navigation and Module Views 491

Isolation Mode and Module Controls 491

Bypassing Isolation 493

Dynamically Loading Controls 493

Toggling Visibility of Sub-Controls 493

Managing Linking 493

Summary 494

CHAPTER 16: DEVELOPING MODULES: BEST PRACTICES AND MOVING FORWARD 495

Managing DNN References and Versions 496

Which Version to Reference 496

Enforcing the Dependency 496

Making Things Easier with NuGet 497

Managing External Dependencies 497

Future-Proofing Data Interactions 498

Bypassing the API 498

Managing Foreign Keys 499

Supporting objectQualifier and databaseOwner 500

Supporting Azure 500

Extension Verification Service (EVS) 501

What It Validates 501

Interpreting the Results 502

Errors 502

Warnings 502

Information Messages 503

System Errors 503

Getting Prepared for DNN neXt 503

Avoiding Deprecated Methods 504

Following Best Practices 504

Staying Active 504

Summary 504

CHAPTER 17: SKINNING 505

Skinning by Today’s Standards 505

Parts of a DNN Skin 506

Skins 506

Containers 506

Skin Objects 506

Skin Packages 506

Installable Skin Packages 507

Content Panes 507

Navigation 507

Folder Structures 508

Skin Locations and Permissions 508

Container Locations 509

Skinning Approaches 510

HTML 510

ASCX 511

Preparing to Create a Skin 512

Preparing your Skinning Environment 512

Choosing an IDE 512

Setting Up Your Website in Visual Studio 512

Creating the Folder Structure 513

Creating Your First Skin 515

HTML Approach 515

ASCX Approach 515

Basic Layout 517

Setting Up a Test Page 517

Content Panes 517

Adding Test Content 519

Adding HTML Modules to the Page 519

Updating Module Titles 520

Adding Text to Your Modules 520

CSS 521

Overriding Basic Styles 524

Linking to Files in Your Skin 524

Document Setup 525

DOCTYPE 525

Skin Objects 526

Registering Skin Objects 526

Defining Skin Objects 526

Setting Up a Responsive Web Design Skin 529

Setting the Viewport Using the Meta Skin Object 529

Creating the CSS Using the Styles Skin Object 530

Conditionals for Internet Explorer 533

Available Skin Objects 533

Client Resource Management (CRM) 533

CSS 534

JS 534

Navigation 536

Sample Menu Structure 536

DDR 541

Menu Style 542

Menu Template 543

Creating Alternate Skins 546

Creating Containers 547

Creating the Folder Structure 547

Creating Your First Container 547

Additional Skin Objects for Containers 549

Styling Containers 549

Creating Additional Containers 550

Custom 404 and Pop-up Skins 554

Skin Thumbnails 555

Creating an Installable Skin Package 555

Packaging the Skin 556

Creating the Skin Package 556

Understanding the DNN Manifest 557

Advanced Skinning Techniques 558

Site Title for Logo 558

Page ID for Page-Specific CSS 558

Page Icon as Header Image 559

Summary 559

CHAPTER 18: PACKAGING AND DISTRIBUTION 561

The New Extensions Model 561

Creating New Extensions 562

Extension Configuration 564

Skin and Container Extension Configuration 564

Module Extension Configuration 565

Skin Object Configuration 570

Provider Extension Configuration 571

Authentication System Configuration 571

Core Language Pack Extensions Configuration 571

Extensions Language Pack Extensions Configuration 572

Using the Wizard to Create Packages 572

Building Packages with Manifest Files 573

Manifest Packages 573

Package Components 575

File Components 576

Assembly Components 576

Script Components 577

Cleanup Components 578

Confi g Components 578

Module Components 580

Skin and Container Components 582

SkinObject Components 583

Language Pack Components 583

Authentication System Components 584

Resource File Components 584

Provider Packages 585

Library Packages 585

Summary 585

CHAPTER 19: COMMERCIAL PHILOSOPHY 587

The Fundamentals 587

Technology 588

Market Conditions 589

Distribution Model 590

Branding 590

Results 591

Summary 591

CHAPTER 20: EVOQ CONTENT 593

Content Creation 593

Asset Manager 594

Flexible Content Layouts 595

Permissions, Workflow, and Versioning 595

Permissions 596

Workflow 596

AutoSave 596

Content Versioning 597

Version Compare 597

Optimization 597

Real-Time Personalization 597

Analytics 598

Integrations 599

Summary 600

CHAPTER 21: EVOQ ENGAGE 601

Management Tools 601

Persona Bar’s Dashboard 601

Overview 602

Modules 603

Persona Bar’s Manage Section 604

Assets 604

Users 604

Persona Bar’s Settings 605

Connectors 605

Gaming Mechanics 606

General Settings 607

Tasks 608

Community Modules 608

Answers 609

Blogs 610

Challenges 610

Discussions 610

Ideas 610

Events 611

Wiki 611

Others 611

Activities 611

Activity Stream 611

Member Profile 612

Leaderboard 612

Group Spaces 613

User Badges 613

Summary 613

CHAPTER 22: THE DNN STORE 615

Buying from the Store 615

Locating Products 615

Product Search 616

The Search Filter 616

Product List Sorting 616

Product List Details 617

Other Ways to Shop 617

The Product Details Page 617

Making a Purchase 619

Managing Your Account 620

Accessing Your Downloads 620

Viewing Past Orders 621

Getting Support 622

Posting Reviews 623

Using the Watch List 624

The Referral Program 624

Managing Your Referral Profile 625

Referring Sales 625

DNN Referral Module 625

Referral Reports 626

Selling on the Store 626

Becoming a Vendor 627

Listing a Product 627

Managing Your Account 632

Managing Your Seller Profile 632

Viewing Your Sales 634

Vendor Charts and Reports 635

Analytics 636

Discounts 636

Using the Help Desk 640

Managing FAQs 640

Managing Product Reviews 641

The Vendor File Manager 641

Sales Tax Configuration 642

Summary 642

CHAPTER 23: DNN ON MICROSOFT AZURE 643

Azure Deployment Scenarios 644

Installing DNN on Azure Websites 644

Install Preparation 645

Preliminary Step 1: Opening a New Azure Subscription 645

Preliminary Step 2: Starting a Credentials File 645

Performing the DNN Installation 646

Step 1: Opening the Azure Site and Creating a New DNN Install 646

Step 2: Choosing the Resource Plan for Your Azure Website 647

Step 3: Creating the Azure Website 648

Step 4: Creating the Database Resource 649

Step 5: Creating a Database Server 650

Step 6: Creating the Azure Website 651

Step 7: Running the DNN Install Wizard 654

Step 8: Adding Domain Names 656

Step 9: Configuring SMTP 659

Step 10: Site Inspection 660

Remote Connections to Azure Websites 660

Remotely Accessing Azure Websites with FTP 661

Step 1: Creating FTP Credentials 661

Step 2: Obtaining the FTP Endpoint 661

Step 3: Opening the FTP Connection 662

Backing Up Your Azure Website 663

Creating a Combined Application/Database Backup 663

Step 1: Choosing the Correct Website Pricing Plan 663

Step 2: Linking the Database and File System 664

Step 3: Creating a Storage Account for Backups 665

Step 4: Creating a Container in the Storage Account 667

Step 5: Creating the Backup 667

Step 6: Creating Scheduled Backups 668

Upgrading to a New DNN Version 670

Preliminary Upgrade Steps 670

Preliminary Step 1: Taking a Backup of Your Installation 670

Preliminary Step 2: Checking Your Host User Credentials 670

Preliminary Step 3: Obtaining the Latest Upgrade Package 670

Preliminary Step 4: Checking Your Dependencies 671

Preliminary Step 5: Considering Using a Test Copy 671

Upgrading DNN 671

Step 1: Uploading the Upgrade Package 671

Step 2: Extracting and Copying the Upgrade Files 672

Step 3: Running the Upgrade Wizard 674

Step 4: Cleaning Up the Upgrade Folder 675

Step 5: Performing Testing and Backup 676

Moving an Existing DNN Site to Azure Websites 676

Preparing Your Installation for Migration 676

Preliminary Step 1: Performing a DNN Install on Azure Websites 676

Preliminary Step 2: Upgrading to the Latest DNN Version 677

Preliminary Step 3: Enabling Auto Add Site Alias 677

Preliminary Step 4: Testing the Database Export Process for Compatibility 677

Preliminary Step 5: Testing the Database Import Process for Compatibility 679

Performing a Site Migration 680

Step 1: Taking Your Existing Site Offline 680

Step 2: Copying and Compressing the Application Files 680

Step 3: Uploading and Unpacking Your Application Files 680

Step 4: Importing Your Database Backup 680

Step 5: Pointing Your Application at the Imported Database 680

Step 6: Trying Your Site 681

Step 7: Completing the Switchover 681

Managing and Troubleshooting Your Azure Website 682

Using Kudu 682

Environment 683

Debug Console 683

Process Explorer 683

Tools 683

Visual Studio Online 686

Other Useful Azure Websites Features 687

Autoscaling 687

Deployment Slots 688

WebJobs 688

Application Monitoring 688

Other Azure Resources 688

Summary 689

APPENDIX A: RESOURCES 691

APPENDIX B: SYSTEM MESSAGE TOKENS 697

INDEX 701

Printer-Ready Version   Share This
With you wherever you go: pdf + ePub + kindle -- DRM-free